﻿#外部宏 MB_OK

WS客户端调度类 g_WS客户端

函数 逻辑型 _调用事件_轮询连接状态()
	返回 g_WS客户端.取连接状态()

类 WS客户端调度类
	逻辑型c m_登陆状态=假
	单文本型 m_链接地址
	WS客户端 m_WS客户端
	逻辑型 m_连接状态 = 假
	链表队列 m_消息队列
	列表框类 m_在线列表
	编辑框类 m_消息展示框
	编辑框类 m_待发送消息框
	窗口类 m_窗口句柄
	函数 构造()
		m_WS客户端.回调事件_建立连接(WS_绑定回调(&WS客户端调度类::回调事件_建立连接, 本类, WS_绑定回调_参数占位符_1))
		m_WS客户端.回调事件_关闭连接(WS_绑定回调(&WS客户端调度类::回调事件_关闭连接, 本类, WS_绑定回调_参数占位符_1))
		m_WS客户端.回调事件_收到消息(WS_绑定回调(&WS客户端调度类::回调事件_收到消息, 本类, WS_绑定回调_参数占位符_1, WS_绑定回调_参数占位符_2))
		m_WS客户端.回调事件_Ping(WS_绑定回调(&WS客户端调度类::回调事件_Ping, 本类, WS_绑定回调_参数占位符_1, WS_绑定回调_参数占位符_2))
		m_WS客户端.回调事件_Pong(WS_绑定回调(&WS客户端调度类::回调事件_Pong, 本类, WS_绑定回调_参数占位符_1, WS_绑定回调_参数占位符_2))
	函数 析构()
		m_WS客户端.停止()
	函数 绑定组件(窗口句柄 窗口句柄, HELE 在线列表句柄, HELE 消息展示框句柄, HELE 待发送消息框句柄)
		m_窗口句柄._句柄 = 窗口句柄
		m_在线列表._句柄 = 在线列表句柄
		m_消息展示框._句柄 = 消息展示框句柄
		m_待发送消息框._句柄 = 待发送消息框句柄
	//================================
	函数 回调事件_建立连接(WS客户端连接* 连接指针)
		m_连接状态 = 真
	函数 回调事件_关闭连接(WS客户端连接* 连接指针)
		m_连接状态 = 假
		系统消息框(m_窗口句柄.取HWND(), "服务器已关闭", "错误", MB_OK)
		A进程_终止(取当前进程句柄(), 0)
	函数 回调事件_收到消息(WS客户端连接* 连接指针,WS消息_客户端* 消息体)
		//m_消息队列.加入消息(消息体->取文本数据A())
		cJSON类 json
		json.解析(U2A(消息体->取文本数据A()))
		常量 单字符型* type=json.取文本(A"type")
		如果 !文本比较A(type, A"更新在线列表")
			更新在线列表(json)
		否则 如果 !文本比较A(type, A"msg")
			收到消息(json)
	函数 逻辑型c 回调事件_Ping(WS客户端连接* 连接指针,常量 单字符型* 负载信息)
		m_WS客户端.Pong()
		返回 真
	函数 回调事件_Pong(WS客户端连接* 连接指针,常量 单字符型* 负载信息)
		m_连接状态 = 文本比较A(负载信息, A"ok") == 0
	//================================
	函数 逻辑型 取连接状态()
		返回 m_连接状态
	函数 单文本型 取错误()
		返回 m_WS客户端.取最后错误信息()
	函数 置地址(文本型 链接地址)
		m_链接地址 = W2A(链接地址)
	函数 停止服务()
		m_WS客户端.停止()
	函数 逻辑型 是否已经登录()
		返回 m_登陆状态
	//当已经登录且连接未断开的情况下为真
	函数 逻辑型 是否可以继续()
		返回 m_登陆状态&&m_连接状态
	函数 逻辑型c 初始化连接()
		如果 ! m_WS客户端.连接(m_链接地址)
			返回 假
		m_WS客户端.运行_异步()
		整型 重试次数 = 0
		循环 重试次数 < 3
			如果 m_WS客户端.是否启动()
				跳出
			延迟(1000)
			重试次数++
		返回 m_WS客户端.是否启动()
	函数 逻辑型c 尝试登录(单文本型 用户名)
		如果 !循环等待事件(_调用事件_轮询连接状态)
			返回 假
		m_WS客户端.Ping(A"connect")
		cJSON类 json
		json.创建()
		json.置文本(A"type", A"登陆")
		json.置文本(A"name",用户名)
		文本型A send = json.取Json文本()
		调试输出(send)
		send = A2U(send)
		m_登陆状态=m_WS客户端.发送文本A(send)
		返回 m_登陆状态
	函数 发送消息更新在线列表()
		cJSON类 json
		json.置文本(A"type", A"更新在线列表")
		m_WS客户端.发送文本A(U2A(json.取Json文本()))
	函数 发送消息(常量 单字符型*消息内容)
		cJSON类 json
		json.置文本(A"type", A"msg")
		json.置文本(A"msg", 消息内容)
		文本型A 发送消息 = json.取Json文本()
		m_WS客户端.发送文本A(A2U(发送消息))
		m_消息展示框.添加文本("我:\n")
		m_消息展示框.添加文本(A2W(消息内容))
		m_消息展示框.添加文本("\n")
		元素_重绘(m_消息展示框._句柄)
	//================================
	函数 更新在线列表(cJSON类&json)
		m_在线列表.删除项全部()
		计次循环 整型 i=0; json.取成员数(A"list")
			单字符型 路径[100]={0}
			文本格式化A(路径, 100, A"list[%d].name", i)
			m_在线列表.添加项文本(A2W(json.取文本(路径)))
		元素_重绘(m_在线列表._句柄,真)
	函数 收到消息(cJSON类& json)
		单文本型 输出文本
		输出文本 = json.取文本(A"name")
		输出文本 += A":\n"
		输出文本 += json.取文本(A"msg")
		m_消息展示框.添加文本(A2W(输出文本))
		m_消息展示框.添加文本("\n")
		元素_重绘(m_消息展示框._句柄)


#函数类型 逻辑型 (*原型_执行事件)()
函数 逻辑型 循环等待事件(原型_执行事件 事件指针, 整型 超时次数=3)
	如果 事件指针 == 空
		返回 真
	逻辑型 结果=假
	整型 i=0
	循环 真
		结果 = 事件指针()
		如果 结果
			跳出
		如果 i >= (超时次数*10)
			结果=假
			跳出
		延迟(100)
		i++

	返回 结果


		